package cn.zhibang.yygh2.service.user.service.impl;

import cn.zhibang.yygh2.common.util.exception.YyghException;
import cn.zhibang.yygh2.common.util.result.ResultCodeEnum;
import cn.zhibang.yygh2.common.util.util.JwtHelper;
import cn.zhibang.yygh2.model.model.user.UserInfo;
import cn.zhibang.yygh2.model.vo.user.LoginVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.zhibang.yygh2.service.user.service.UserInfoService;
import cn.zhibang.yygh2.service.user.mapper.UserInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
* @author Administrator
* @description 针对表【user_info(用户表)】的数据库操作Service实现
* @createDate 2023-04-28 19:15:36
*/
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo>
    implements UserInfoService{

    //自动装配RedisTemplate
    @Autowired
    private RedisTemplate<String, String> redisTemplate;


    @Override
    public Map<String, Object> login(LoginVo loginVo) {
        //实现步骤：

        //返回登录信息
        //返回登录用户名
        //返回token信息
        //1.从loginVo获取输入的手机号和验证码
        String phone = loginVo.getPhone();
        String code = loginVo.getCode();
        //校验参数
        //2.判断手机号和验证码是否为空
        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)) {
            throw new YyghException(ResultCodeEnum.PARAM_ERROR); //参数错误
        }
        //3.判断手机验证码和输入的验证码是否一致
        //TODO 校验校验验证码
        //根据手机号从redis中获得验证码
        String redisCode = redisTemplate.opsForValue().get(phone);
        //校验验证码是否相同，如果不相同，抛出验证码异常
        if(!code.equals(redisCode)) {
            throw new YyghException(ResultCodeEnum.CODE_ERROR);
        }

        //4.判断是否第一次登录： 根据手机号查询数据库，如果不存在相同手机号就是第一次登录
        //手机号已被使用
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("phone", phone);
        //获取会员
        UserInfo userInfo = baseMapper.selectOne(queryWrapper);
        //5.如果等于null，表示是第一次，
        if(null == userInfo) {
            userInfo = new UserInfo();
            userInfo.setName("");
            userInfo.setPhone(phone);
            userInfo.setStatus(0);
            //this.save(userInfo);
            baseMapper.insert(userInfo);
        }
        //校验是否被禁用
        if(userInfo.getStatus() == 1) {
            throw new YyghException(ResultCodeEnum.LOGIN_DISABLED_ERROR);
        }

        //TODO 记录登录

        //返回页面显示名称
        Map<String, Object> map = new HashMap<>();
        String name = userInfo.getName();
        if(StringUtils.isEmpty(name)) {
            name = userInfo.getNickName();
        }
        if(StringUtils.isEmpty(name)) {
            name = userInfo.getPhone();
        }
        map.put("name", name);
        // 使用JWT工具生成token字符串
        String token = JwtHelper.createToken(userInfo.getId(), name);
        map.put("token", "");
        return map;
    }

}




